package com.egao.common.component.crawler.haitou;

import com.egao.common.module.outer.entity.OuterPreach;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

import java.util.List;

/**
 * 海投网宣讲会爬虫
 * @author lym
 */
public class HaiTouProcessor implements PageProcessor {

    /**
     * 爬虫站点配置
     * 重试次数 1
     * 爬取间隔 2s
     */
    private Site site = Site.me().setRetrySleepTime(1).setSleepTime(2000);

    /**
     * 海投网高校宣讲会列表地址
     * '@'代表所属大学
     * 1~7是武汉7所211
     * 不爬取5,5是中南财经政法大学
     */
    private static final String URL_LIST = "https://xjh\\.haitou\\.cc/wh/uni-@/after/page-\\d+";
    /**
     * 宣讲会详情地址
     */
    private static final String URL_POST = "https://xjh\\.haitou\\.cc/article/\\w+\\.html";

    /**
     * 构建爬虫内容
     * @param page page
     */
    public void buildPage(Page page) {
        page.putField("title", page.getHtml().xpath("//h1[@class='article-title']/text()").toString());
        page.putField("holdTime", page.getHtml().xpath("//div[@class='main-info']/div[1]/p[2]/span[2]/span[1]/text()").toString());
        page.putField("holdAddress", page.getHtml().xpath("//div[@class='main-info']/div[2]/p[1]/span[2]/text()").toString());
        page.putField("content", page.getHtml().xpath("//div[@class='article-content']/html()").toString());
        page.putField("url", page.getUrl().get());
        page.putField("schoolName", page.getHtml().xpath("//div[@class='main-info']/div[1]/p[1]/span[2]/text()").toString());
        page.putField("createTime", page.getHtml().xpath("//div[@class='main-info']/div[2]/p[2]/span[2]/text()").toString());
    }

    @Override
    public void process(Page page) {
        // 如果当前页面为列表页
        // 加入待爬取链接
        // 加入待爬取链接的有本页面中的详情链接以后后续的翻页链接
        if (!page.getUrl().regex(URL_POST).match()) {
            // 详情链接加入待爬取列队中
            page.addTargetRequests(page.getHtml().links().regex(URL_POST).all());

            // 确认并替换当前列表页类型
            int i = page.getUrl().get().indexOf("-");
            String category = page.getUrl().get().substring(++i, ++i);
            page.addTargetRequests(page.getHtml().links().regex(URL_LIST.replace("@", category)).all());
        } else {
            buildPage(page);
        }
    }

    @Override
    public Site getSite() {
        return site;
    }

    /**
     * 开始爬虫
     * @param list 装载结果的容器
     * @param urls 需要爬取的首页列表地址(多个)
     */
    public static void start(List<OuterPreach> oldList, List<OuterPreach> list, String[] urls) {
        Spider.create(new HaiTouProcessor())
                // 加入需要爬取的首页列表
                .addUrl(urls)
                // 加入处理爬取结果对象
                .addPipeline(new HaiTouPipeline(oldList,list))
                // 1个线程执行
                .thread(1)
                // 执行
                .run();
    }
}
